import { CaseApi } from "@/api";

interface RequestData<T> {
  cnmsg: string;
  code: number;
  data: T;
  enmsg: string;
}

const handleError = (error: Error) => {
  let message = error.message;
  const result: RequestData<null> = {
    cnmsg: message,
    code: -1,
    enmsg: message,
    data: null,
  };
  return result;
};
/** 也可以直接promise 连着写， 请求的问题不大。也可以用取反的条件 不等于什么什么，处理错误，最后就是正确的。也可以直接返回错误，不用处理 */

export const request = async <T = null>(path: string, params?: object) => {
  const body = JSON.stringify({ ...params });
  const route = `xx${path}`;
  const headers = {
    "Content-Type": "application/json",
  };

  try {
    const res = await fetch(route, {
      method: "POST",
      mode: "same-origin",
      headers,
      body,
    });
    if (res?.status === 200) {
      const data: RequestData<T> = await res.json();

      if (data.cnmsg === "ok" && data?.code === 200) {
        return data.data;
      } else if (data.code === 401) {
        window.location.href = `${window.location.origin}/login?from=${window.location.href}`;
        throw new Error("没有权限");
      }
      /** 每次都需要写返回的类型，则返回的类型始终是确定的。 */
      return Promise.reject(data);
    } else {
      const error = handleError(new Error("请求异常"));
      /** 每次都需要写返回的类型 */
      return Promise.reject(error);
    }
  } catch (error: any) {
    const data = handleError(error);
    return Promise.reject(data);
  }
};

/** 抛出异常,catch会立即捕获异常，如果直接 return 则是处理异常情况，则会在后面处理 */
// const getData = async () => {
//   try {
//     const res = CaseApi.fetchPosition({ name: "" });

//     return res;
//   } catch (error: any) {
//     console.log(error);
//     return Promise.reject(error);
//   }
// };

// getData();
